/*
 * Copyright (c) 2007, 2015, Oracle and/or its affiliates. All rights reserved.
 * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 */
/*
 * Copyright 2001, 2002,2004 The Apache Software Foundation.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.sun.org.apache.xerces.internal.impl.dv;

import com.sun.org.apache.xerces.internal.xs.XSSimpleTypeDefinition;

/**
 * This interface <code>XSSimpleType</code> represents the simple type
 * definition of schema component and defines methods to query the information
 * contained.
 * Any simple type (atomic, list or union) will implement this interface.
 * It inherits from <code>XSTypeDecl</code>.
 *
 * @author Sandy Gao, IBM
 * @xerces.internal
 */
public interface XSSimpleType extends XSSimpleTypeDefinition {

  /**
   * constants defined for the values of 'whitespace' facet.
   * see <a href='http://www.w3.org/TR/xmlschema-2/#dt-whiteSpace'> XML Schema
   * Part 2: Datatypes </a>
   */
  /**
   * preserve the white spaces
   */
  public static final short WS_PRESERVE = 0;
  /**
   * replace the white spaces
   */
  public static final short WS_REPLACE = 1;
  /**
   * collapse the white spaces
   */
  public static final short WS_COLLAPSE = 2;

  /**
   * Constant defined for the primitive built-in simple tpyes.
   * see <a href='http://www.w3.org/TR/xmlschema-2/#built-in-primitive-datatypes'>
   * XML Schema Part 2: Datatypes </a>
   */
  /**
   * "string" type
   */
  public static final short PRIMITIVE_STRING = 1;
  /**
   * "boolean" type
   */
  public static final short PRIMITIVE_BOOLEAN = 2;
  /**
   * "decimal" type
   */
  public static final short PRIMITIVE_DECIMAL = 3;
  /**
   * "float" type
   */
  public static final short PRIMITIVE_FLOAT = 4;
  /**
   * "double" type
   */
  public static final short PRIMITIVE_DOUBLE = 5;
  /**
   * "duration" type
   */
  public static final short PRIMITIVE_DURATION = 6;
  /**
   * "dataTime" type
   */
  public static final short PRIMITIVE_DATETIME = 7;
  /**
   * "time" type
   */
  public static final short PRIMITIVE_TIME = 8;
  /**
   * "date" type
   */
  public static final short PRIMITIVE_DATE = 9;
  /**
   * "gYearMonth" type
   */
  public static final short PRIMITIVE_GYEARMONTH = 10;
  /**
   * "gYear" type
   */
  public static final short PRIMITIVE_GYEAR = 11;
  /**
   * "gMonthDay" type
   */
  public static final short PRIMITIVE_GMONTHDAY = 12;
  /**
   * "gDay" type
   */
  public static final short PRIMITIVE_GDAY = 13;
  /**
   * "gMonth" type
   */
  public static final short PRIMITIVE_GMONTH = 14;
  /**
   * "hexBinary" type
   */
  public static final short PRIMITIVE_HEXBINARY = 15;
  /**
   * "base64Binary" type
   */
  public static final short PRIMITIVE_BASE64BINARY = 16;
  /**
   * "anyURI" type
   */
  public static final short PRIMITIVE_ANYURI = 17;
  /**
   * "QName" type
   */
  public static final short PRIMITIVE_QNAME = 18;
  /**
   * "precisionDecimal" type
   */
  public static final short PRIMITIVE_PRECISIONDECIMAL = 19;
  /**
   * "NOTATION" type
   */
  public static final short PRIMITIVE_NOTATION = 20;

  /**
   * return an ID representing the built-in primitive base type.
   * REVISIT: This method is (currently) for internal use only.
   * the constants returned from this method are not finalized yet.
   * the names and values might change in the further.
   *
   * @return an ID representing the built-in primitive base type
   */
  public short getPrimitiveKind();

  /**
   * validate a given string against this simple type.
   *
   * @param content the string value that needs to be validated
   * @param context the validation context
   * @param validatedInfo used to store validation result
   * @return the actual value (QName, Boolean) of the string value
   */
  public Object validate(String content, ValidationContext context, ValidatedInfo validatedInfo)
      throws InvalidDatatypeValueException;

  /**
   * validate a given string value, represented by content.toString().
   * note that if content is a StringBuffer, for performance reasons,
   * it's possible that the content of the string buffer is modified.
   *
   * @param content the string value that needs to be validated
   * @param context the validation context
   * @param validatedInfo used to store validation result
   * @return the actual value (QName, Boolean) of the string value
   */
  public Object validate(Object content, ValidationContext context, ValidatedInfo validatedInfo)
      throws InvalidDatatypeValueException;

  /**
   * Validate an actual value against this simple type.
   *
   * @param context the validation context
   * @param validatedInfo used to provide the actual value and member types
   * @throws InvalidDatatypeValueException exception for invalid values.
   */
  public void validate(ValidationContext context, ValidatedInfo validatedInfo)
      throws InvalidDatatypeValueException;

  /**
   * If this type is created from restriction, then some facets can be applied
   * to the simple type. <code>XSFacets</code> is used to pass the value of
   * different facets.
   *
   * @param facets the value of all the facets
   * @param presentFacet bit combination value of the costraining facet constants which are
   * present.
   * @param fixedFacet bit combination value of the costraining facet constants which are fixed.
   * @param context the validation context
   * @throws InvalidDatatypeFacetException exception for invalid facet values.
   */
  public void applyFacets(XSFacets facets, short presentFacet, short fixedFacet,
      ValidationContext context)
      throws InvalidDatatypeFacetException;

  /**
   * Check whether two actual values are equal.
   *
   * @param value1 the first value
   * @param value2 the second value
   * @return true if the two value are equal
   */
  public boolean isEqual(Object value1, Object value2);

  /**
   * Check the order of the two actual values. (May not be supported by all
   * simple types.
   * REVISIT: Andy believes that a compare() method is necessary.
   *          I don't see the necessity for schema (the only place where we
   *          need to compare two values is to check min/maxIn/Exclusive
   *          facets, but we only need a private method for this case.)
   *          But Andy thinks XPATH potentially needs this compare() method.
   *
   * @param value1  the first value
   * @prarm value2  the second value
   * @return        > 0 if value1 > value2
   *                = 0 if value1 == value2
   *                < = if value1 < value2
   */
  //public short compare(Object value1, Object value2);

  /**
   * Check whether this type is or is derived from ID.
   * REVISIT: this method makes ID special, which is not a good design.
   * but since ID is not a primitive, there doesn't seem to be a
   * clean way of doing it except to define special method like this.
   *
   * @return whether this simple type is or is derived from ID.
   */
  public boolean isIDType();

  /**
   * Return the whitespace corresponding to this datatype.
   *
   * @return valid values are WS_PRESERVE, WS_REPLACE, WS_COLLAPSE.
   * @throws DatatypeException union datatypes don't have whitespace facet associated with them
   */
  public short getWhitespace() throws DatatypeException;
}
